/**
 * 基于 Slab 的 kmalloc 实现。
 */
#ifndef _AHAMOLETT_KMALLOC_H_
#define _AHAMOLETT_KMALLOC_H_

#include <mm/slab_types.h>

/* kmalloc 能分配的最小内存块大小的阶数。 */
#define KMALLOC_MINIMUN_ORDER   3
/* kmalloc 能分配的最大内存块大小的阶数加一。 */
#define KMALLOC_MAX_ORDER   17

/**
 * @brief 初始化与 kmalloc 相关的 Slab 分配器。
 * 
 * 初始化 kmalloc 相关的所有 Slab 分配器。因为目标平台内存紧张，所以不会预先分配空间。
 * 
 * @return int 成功返回0，失败返回-1。
 */
extern int kmalloc_init(void);

/**
 * @brief 分配 size 大小的内存空间。
 * 
 * 从 kmalloc 所属的 Slab 分配器中分配一块内存空间。实际分配到的内存空间大小会被扩展到
 * 2^k 字节，k最小为 KMALLOC_MINIMUN_ORDER，最大不能超过 KMALLOC_MAX_ORDER。如果要求
 * 的空间大小过大，会分配失败。
 * 
 * @param size 需要内存空间的大小。
 * 
 * @return void* 分配成功返回分配到的内存空间的首地址，失败返回NULL。
 */
extern void *kmalloc(size_t size);

/**
 * @brief 释放用 kmalloc 分配的内存空间。
 * 
 * @param ptr 释放的内存空间首地址。
 */
extern void kfree(void *ptr);

/**
 * @brief 用于DEBUG，获得malloc对应order的kmalloc_cache的page_order。
 */
extern unsigned long get_kmalloc_page_order(unsigned long order);
/**
 * @brief 用于DEBUG，获得malloc对应order的kmalloc_cache的空闲内存对象数量。
 */
extern unsigned long get_kmalloc_free_objs_num(unsigned long order);

#endif
